// 使用async的mapLimit方法，限制并发的次数，知道执行完毕
const server = require('express');
const superagent = require('superagent');
const cheerio = require('cheerio');
const async = require('async');

const app = server();

// 需要执行的函数
superagent.get('https://cnodejs.org/')
    .end(function (err, sres) {
        // 常规的错误处理
        if (err) {
            console.log(err);
            return;
        }
        // sres.text 里面存储着网页的 html 内容，将它传给 cheerio.load 之后
        // 就可以得到一个实现了 jquery 接口的变量，我们习惯性地将它命名为 `$`
        // 剩下就都是 jquery 的内容了
        var $ = cheerio.load(sres.text);
        var hrefs = [];
        // 2、将所有的次级链接放入数组中
        $('#topic_list .topic_title').each(function (idx, element) {
            var $element = $(element);
            hrefs.push('https://cnodejs.org' + $element.attr('href'));
        });
        var num = 0;
        // console.log(hrefs.slice(0,6));
        async.mapLimit(hrefs.slice(0,6),3,async function(url) {
            // fetchurl(url,callback);
            num++
            console.log(num);
            // return await superagent.get(url)
            //     .end(function (err, res) {
            //         console.log('fetch ' + url + ' successful');
            //     });
            return setTimeout(() => {
                return 1
            }, 500);
        },function(err,result) {
            if(!err) {
                console.log('程序执行结束：',result);
            }else {
                console.log('程序执行失败：',err);
            }
        })
    });
var num = 0;
function fetchurl(url,callback) {
    num++;
    console.log('当前的并发数为：',num,'正在抓取',url,'的数据');
    callback(num--,url);
}
app.listen(8002,function() {
    console.log('程序运行在8002端口');
})